<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>图片懒加载</title>
</head>
<body>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。<br>
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<h1>这下面是一张图片</h1>
<img alt="" data-src="./img/modx.png">
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。<br>
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<h1>这下面是一张图片</h1>
<img alt="" data-src="./img/sou.png">
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。<br>
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<p>通过 InterSectionObserver造的对象来观察目标与视口是否有交叉，来决定是否让 img 有 src。
  另一种实现是通过监听每个目标距离 document 顶部距离以及 document 滚出视口的距离差来判断是否向 img 写入 src 值。
  明显是 IntersectionObserver 更优雅。</p>
<h1>这下面是一张图片</h1>
<img alt="" data-src="./img/vue.png">
</body>
<script>
  let images = document.querySelectorAll('img')

  // 页面滚动监听
  /*window.addEventListener('scroll', (e) => {
    images.forEach(img => {
      let top = img.getBoundingClientRect().top  // 图片距离视口上方的距离
      console.log('innerHeight:', window.innerHeight) //innerHeight: 722 视口高度
      if (top < window.innerHeight) {
        const data_src = img.getAttribute('data-src')
        img.setAttribute('src', data_src)
      }
    })
  })*/

  // 利用交叉观察
  // var observer = new IntersectionObserver(callback,options); callback是当被监听元素的可见性变化时，触发的回调函数
  // options是一个配置参数，可选，有默认的属性值
  // callback一般会触发两次。一次是目标元素刚刚进入视口（开始可见），另一次是完全离开视口（开始不可见）。

  // 每当目标元素与设备视窗或者其他指定元素发生交集的时候执行

  const callback = function (entries) {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        console.log(entry.target) // 获取的是img的dom
        let img_dom = entry.target
        const data_src = img_dom.getAttribute('data-src')
        setTimeout(() => {
          img_dom.setAttribute('src', data_src)
        }, 2000)

      }
    })
  }

  const observer = new IntersectionObserver(callback)

  images.forEach(img => {
    observer.observe(img)
  })

</script>
</html>